package ${domain}.frame.utils;

import java.lang.reflect.Array;

/**
 * ArrayUtil - 数组操作工具
 *
 * @author wangbing
 * @version 0.0.1
 * @since 2017-01-01
 */
public class ArrayUtil {

    /**
     * 数组克隆
     *
     * @param array 待克隆数组
     * @param <T>   泛型
     * @return 数组
     */
    public static <T> T[] clone(T[] array) {
        return array == null ? null : array.clone();
    }


    /**
     * 数组合并
     *
     * @param array1 待合并数组1
     * @param array2 待合并数组2
     * @param <T>    泛型
     * @return 数组
     */
    public static <T> T[] merge(T[] array1, T... array2) {
        if (array1 == null) {
            return clone(array2);
        } else if (array2 == null) {
            return clone(array1);
        } else {
            Class<?> type1 = array1.getClass().getComponentType();
            T[] joinedArray = (T[]) Array.newInstance(type1, array1.length + array2.length);
            System.arraycopy(array1, 0, joinedArray, 0, array1.length);

            try {
                System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
                return joinedArray;
            } catch (ArrayStoreException var6) {
                Class<?> type2 = array2.getClass().getComponentType();
                if (!type1.isAssignableFrom(type2)) {
                    throw new IllegalArgumentException("Cannot store " + type2.getName() + " in an array of " + type1.getName(), var6);
                } else {
                    throw var6;
                }
            }
        }
    }

}
